/* Autor : Jannis Migdalas
Klasse : FI1.1
Dateiname : bridges.c
Datum : 10.05.2011
Beschreibung: Das Programm enthält die Steuerung und Regeln des Spiels "Bridges"
Version : 1.0
Programmschnittstelle:
int setToken(int i, int j)
//Setzt den Spielstein in das Feld
	1.Parameter: X-Koordinate im Spielfeld
	2.Parameter: Y-Koordinate im Spielfeld
int isLegal(int i, int j)
//checkt, ob der Spielzug möglich ist
	1.Parameter: X-Koordinate im Spielfeld
	2.Parameter: Y-Koordinate im Spielfeld

*/
#include "header.h"
#include "bridges.h"
#include <ctype.h>

//Spielfeld bestehend aus 2 dimensionalem Array
int iBoard[17][17];
//Variable, die den aktuellen Spieler ermittelt
int iActivePlayer;
//Hilfsvariable
int iVar;

//Funktion zum Aufruf von Bridges
int main()
{	
	//Varibale, die den Gewinner enthält
   int iWinner   = 0;

   iVar          = 0;
   iActivePlayer = -1;

   fillEmpty(iBoard);

   Bridges_init();
   
	//solange kein Gewinner, wird Spiel gespielt 
   while ( (iWinner = BridgesWinner(iBoard)) == 0)
   {  
		//Spieler wird gewechselt
      changePlayer();
      do
      {
			//Spielfeld wird ausgegeben
         board_Output(iBoard,iVar);
      }while ( ! getCMD() );
   }
   //Zum Schluß wird das Spielfeld ausgegeben
   board_Output(iBoard,iVar);

	//gibt SPieler eins als Gewinner aus
    if(iWinner == 1)
    {
        printf("Spieler 1 hat gewonnen\n");
                system("pause");
        return SIEG1;
    }
    if(iWinner == -1)
    {
        printf("Spieler 2 hat gewonnen\n");
                system("pause");
        return SIEG2;
    }
    
   return 0;
}

//Initialisiert das Spielfeld
void Bridges_init(void)
{
	int iBreite,
		 iHoehe;

	for (iBreite = 0; iBreite < 17; iBreite++)
	{
		for (iHoehe = 0; iHoehe < 17; iHoehe++)
		{
			if (iBreite % 2 == 1 && iHoehe % 2 == 0)
			{
				iBoard[iBreite][iHoehe] = 1;
			}
			if (iBreite % 2 == 0 && iHoehe % 2 == 1)
			{
				iBoard[iBreite][iHoehe] = -1;
			}
		}

	}
	return;
}


//wechselt den Spieler
void changePlayer(void)
{
	iActivePlayer = iActivePlayer * -1;
	return;
}



//Funktion für die Zugeingabe
int getCMD(void)
{
	char cColumn = 127;
	int  iColumn = -1,
		  iRow    = -1;
	int  iError = 0;
    
	//Token für Spieler1
	if(iActivePlayer == 1)
	{
	printf("\xB0");
	}
	//Token für Spieler2
	else
	{
	printf("\xB1");
	}
    
	do
	{
	cColumn = 127;
	iRow    = -1;
	if (iError > 0) {
		printf("\n\tDieser Zug ist ungueltig. Probieren Sie es noch einmal\n");
		getchar();
		return 0;
	}

	//relativiert groß und kleinschreibung bei der Eingabe
	while (!(tolower(cColumn) >= 'a' && tolower(cColumn) <= 'q'))
	{
		if(tolower(cColumn) == '0')
		{
			changeVar();
			return 0;
		}
		//fordert zum Zug auf und nennt Spieler
      printf("\n\t%s, bitte geben Sie die Spalte an -> ", (iActivePlayer==1?acBenutzernameEins:acBenutzernameZwei));
      scanf("%c", &cColumn);
                  if(cColumn == 'x' || cColumn == 'X')
                  {
                           return ABBRUCH;
                  }
      fflush(stdin);
	}
	iColumn = tolower(cColumn) - 'a';

	while (!(iRow > 0 && iRow <= 17))
   {
		if(iRow == 0)
		{
				changeVar();
				return 0;
		}
		printf("\n\t%s, bitte geben Sie die Zeile an -> ", (iActivePlayer==1?acBenutzernameEins:acBenutzernameZwei));
		scanf("%d", &iRow);
						if(iRow == 71 || iRow == 39)
						{
									return ABBRUCH;
						}
		fflush(stdin);
	}
   iRow--;     
	iError++;
	}while (setToken(iRow, iColumn) == FALSE);
	return 1;
}


//überprüft ob der Zug legal ist
int isLegal(int i, int j)
{
	if (iBoard[i][j] == 0)
	{
		return TRUE;
	}
	return FALSE;
}

//setzt den Spielstein
int setToken(int i, int j)
{	
	if (isLegal(i, j) == TRUE)
	{
		iBoard[i][j] = iActivePlayer;
		return TRUE;
	}
	return FALSE;
}

//verändert die Hilfvariable. Wenn 0, setze 1. Wenn was Anderes, setze 0
void changeVar()
{
	iVar = iVar == 0 ? 1:0;
	return;
}
